package persistencia;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import logica.Area;
import logica.Persona;
import logica.UsuarioRegistrado;
import excepciones.DAOExcepcion;

public class UsuarioRegistradoDAOImp extends PersonaDAOImp implements IUsuarioRegistradoDAO {

	public UsuarioRegistradoDAOImp() throws DAOExcepcion {
		super();
	}

	@Override
	public void crearUsuarioRegistrado(UsuarioRegistrado p) throws DAOExcepcion {

		if (p.getNif() == null) {
			throw new DAOExcepcion("NIF no válido");
		}

		try {

			if (this.encontrarPersonaPorNif(p.getNif()) == null) {
				this.crearPersona(p);

				connManager.connect();

				connManager
						.updateDB("insert into USUARIOREGISTRADO (NOMBREUSUARIO, CONTRASENYA, EMAIL, AREASINTERES, ALERTADO, NIF) values ('"
								+ p.getNombreUsuario()
								+ "', '"
								+ p.getContrasenya()
								+ "', '"
								+ p.getEmail()
								+ "', '"
								+ p.getAreasInteres() + "', " + p.getAlertado() + " , '" + p.getNif() + "')");

				connManager.close();

			} else {
				throw new DAOExcepcion("USU_REG_EXISTE");
			}
		} catch (DAOExcepcion e) {
			throw e;
		}
	}

	@Override
	public UsuarioRegistrado encontrarUsuarioRegistradoPorNombreUsuario(String nombreUsuario) throws DAOExcepcion {
		AreaDAOImp areaDAO = new AreaDAOImp();
		try {
			connManager.connect();
			ResultSet rs = connManager
					.queryDB("select NOMBREUSUARIO, EMAIL, AREASINTERES, ALERTADO, NIF, CONTRASENYA, EDITOR_AREA from USUARIOREGISTRADO where NOMBREUSUARIO= '"
							+ nombreUsuario + "'");
			connManager.close();
			try {
				if (rs.next()) {
					Persona p = this.encontrarPersonaPorNif(rs.getString("NIF"));

					UsuarioRegistrado u = new UsuarioRegistrado(p.getNif(), p.getNombre(), p.getApellidos(),
							rs.getString("NOMBREUSUARIO"), rs.getString("CONTRASENYA"), rs.getString("EMAIL"),
							rs.getString("AREASINTERES"), rs.getBoolean("ALERTADO"));

					if (rs.getString("EDITOR_AREA").length() > 0) {
						u.setAreaEditada(areaDAO.encontrarAreaPorNombre(rs.getString("EDITOR_AREA")));
					}

					return u;
				} else {
					return null;
				}
			} catch (SQLException e) {
				throw new DAOExcepcion("DB_READ_ERROR");
			}

		} catch (DAOExcepcion e) {
			throw e;
		}
	}

	@Override
	public List<UsuarioRegistrado> encontrarUsuariosRegistrados() throws DAOExcepcion {

		try {
			AreaDAOImp areaDAO = new AreaDAOImp();

			connManager.connect();

			ResultSet rs = connManager.queryDB("select * from USUARIOREGISTRADO");

			connManager.close();

			List<UsuarioRegistrado> listaUsuariosRegistrados = new ArrayList<UsuarioRegistrado>();
			try {
				while (rs.next()) {
					Persona p = this.encontrarPersonaPorNif(rs.getString("NIF"));

					UsuarioRegistrado ur = new UsuarioRegistrado(p.getNif(), p.getNombre(), p.getApellidos(),
							rs.getString("NOMBREUSUARIO"), rs.getString("CONTRASENYA"), rs.getString("EMAIL"),
							rs.getString("AREASINTERES"), rs.getBoolean("ALERTADO"));

					if (rs.getString("EDITOR_AREA") != null) {
						ur.setAreaEditada(areaDAO.encontrarAreaPorNombre(rs.getString("EDITOR_AREA")));
					}

					listaUsuariosRegistrados.add(ur);
				}
				return listaUsuariosRegistrados;
			} catch (SQLException e) {
				e.printStackTrace();
				throw new DAOExcepcion("DB_READ_ERROR, " + e.getMessage());
			}
		} catch (DAOExcepcion e) {
			throw e;
		}
	}

	@Override
	public UsuarioRegistrado encontrarUsuarioRegistradoPorNif(String nif) throws DAOExcepcion {

		if (nif == null || nif.equals("")) {
			throw new DAOExcepcion("NIF no válido");
		}

		AreaDAOImp areaDAO = new AreaDAOImp();

		try {
			connManager.connect();
			ResultSet rs = connManager
					.queryDB("select us.ALERTADO, us.AREASINTERES, us.CONTRASENYA, us.EMAIL, us.NOMBREUSUARIO, p.NOMBRE, p.APELLIDOS, us.EDITOR_AREA from USUARIOREGISTRADO as us, PERSONA as p where p.NIF= '"
							+ nif + "' and us.NIF='" + nif + "'");
			connManager.close();
			try {

				if (rs.next()) {

					UsuarioRegistrado u = new UsuarioRegistrado(nif, rs.getString("NOMBREUSUARIO"),
							rs.getString("APELLIDOS"), rs.getString("NOMBREUSUARIO"), rs.getString("CONTRASENYA"),
							rs.getString("EMAIL"), rs.getString("AREASINTERES"), rs.getBoolean("ALERTADO"));

					if (rs.getString("EDITOR_AREA") != null) {
						u.setAreaEditada(areaDAO.encontrarAreaPorNombre(rs.getString("EDITOR_AREA")));
					}

					return u;
				} else {
					return null;
				}

			} catch (SQLException e) {
				throw new DAOExcepcion("DB_READ_ERROR");
			}

		} catch (DAOExcepcion e) {
			throw e;
		}
	}

	@Override
	public void actualizaUsuarioRegistradoEditaAreaPorNif(Area area) throws DAOExcepcion {

		try {
			connManager.connect();
			connManager.updateDB("UPDATE USUARIOREGISTRADO SET EDITOR_AREA='" + area.getNombre() + "' WHERE NIF='"
					+ area.getEditorArea().getNif() + "'");
			connManager.close();

		} catch (DAOExcepcion e) {
			throw e;
		}
	}

}
